#include_function".\src\lib_Reimu.txt"

//0.275
//10
//10
//6,9,15,15,9,6
let DMG_MAINSHOT=2.75;
let DMG_SUBSHOT=2.75;
let DMG_BUSTER=[1.65, 2.475, 4.125, 4.125, 2.475,1.65];

sub onInitialize_ReimuC{
	onInitialize_Reimu;
	LoadPlayerShotData(csd~"src\data_playershot_rc.txt");
}



task Main{
	yield;
	Buster;
	Options;
	BombEffect;
	th10_System;
}



task Buster{
	let c=0;
	let x=[0,0,-10,10,0,0];
	let ang=[250,260,270,270,280,290];
	
	loop{
		if(
			((GetKeyState(VK_SHOT)==KEY_PUSH)||(GetKeyState(VK_SHOT)==KEY_HOLD))&&
			(!OnMissed)&&
			(!OnEvent)
		){
			c=6;
		}
		if(
			(c>0)&&
			(!OnMissed)&&
			(!OnEvent)
		){
			PlayShotSE;
			if((GetKeyState(VK_SLOWMOVE)==KEY_PUSH)||(GetKeyState(VK_SLOWMOVE)==KEY_HOLD)){
				ascent(i in 0..6){
					BusterShot(GetPlayerX+x[i],GetPlayerY-8,ang[i],DMG_BUSTER[i]);
				}
			}else{
				MainShot(-10);
				MainShot(10);
			}
			c--;
			loop(2){yield;}
		}
		yield;
	}

	task BusterShot(x,y,ang,dmg){
		let obj=Obj_Create(OBJ_SHOT);
		let alpha=255;
		let dalpha=42;
		let dang=10;
		let gang=ang+90;
		let flg=false;
		Obj_SetPosition(obj,x,y);
		Obj_SetSpeed(obj,36);
		Obj_SetAngle(obj,ang);
		ObjShot_SetGraphic(obj,2);
		ObjShot_SetDamage(obj,dmg);
		ObjShot_SetPenetration(obj,1);
		
		let obje=Obj_Create(OBJ_EFFECT);
		ObjEffect_SetTexture(obje,IMG_SHOT);
		ObjEffect_SetPrimitiveType(obje,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_SetLayer(obje,2);
		ObjEffect_SetAngle(obje,0,0,gang);
		ObjEffect_CreateVertex(obje,4);
		ObjEffect_SetVertexUV(obje,0,40,0);
		ObjEffect_SetVertexUV(obje,1,40,56);
		ObjEffect_SetVertexUV(obje,2,52,0);
		ObjEffect_SetVertexUV(obje,3,52,56);
		ObjEffect_SetVertexXY(obje,0,-6,-28);
		ObjEffect_SetVertexXY(obje,1,-6,28);
		ObjEffect_SetVertexXY(obje,2,6,-28);
		ObjEffect_SetVertexXY(obje,3,6,28);
		while(!Obj_BeDeleted(obj)){
			flg=Obj_IsIntersected(obj);
			if(flg){break;}
			x=Obj_GetX(obj);
			y=Obj_GetY(obj);
			Obj_SetPosition(obje,x,y);
			yield;
		}
		
		if(!flg){
			Obj_Delete(obje);
			return;
		}
		
		ObjEffect_SetVertexUV(obje,0,53,1);
		ObjEffect_SetVertexUV(obje,1,53,15);
		ObjEffect_SetVertexUV(obje,2,63,1);
		ObjEffect_SetVertexUV(obje,3,63,15);
		ObjEffect_SetVertexXY(obje,0,-5,-7);
		ObjEffect_SetVertexXY(obje,1,-5,7);
		ObjEffect_SetVertexXY(obje,2,5,-7);
		ObjEffect_SetVertexXY(obje,3,5,7);
		ObjEffect_SetRenderState(obje,ADD);
		ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
		gang+=30;
		x+=20*cos(ang);
		y+=20*sin(ang);
		ascent(i in 0..24){
			Obj_SetPosition(obje,x,y);
			x+=4*cos(ang);
			y+=4*sin(ang);
			ObjEffect_SetAngle(obje,0,0,gang);
			gang+=dang;
			if(i>=18){
				ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
				alpha-=dalpha;
				ObjEffect_SetVertexUV(obje,0,53,17);
				ObjEffect_SetVertexUV(obje,1,53,31);
				ObjEffect_SetVertexUV(obje,2,63,17);
				ObjEffect_SetVertexUV(obje,3,63,31);
			}
			yield;
		}
		Obj_Delete(obje);
	}
}



task Options{
	let posx=[-64,-32,32,64];
	let gang=0;
	let fire=false;
	let cenx=GetPlayerX;
	let ceny=GetPlayerY;
	let scalex=1;
	let scaley=1;
	let dscale=0.05;
	let alpha=255;
	let dalpha=16;
	
	Move;
	CreateOptions;
	SlowMove;
	ShotControl;
	VanishControl;
	Rotate;
	
	
	function CreateOptions{
		ascent(n in 0..4){Option(n);}
	}
	
	
	task Move{
		let ang;
		let distance;
		loop{
			if(OnMissed && !OnBorderOfLife){
				while(OnMissed){yield;}
				cenx=GetPlayerX;
				ceny=GetPlayerY;
			}else{
				ang=atan2(GetPlayerY-ceny,GetPlayerX-cenx);
				distance=((GetPlayerX-cenx)^2+(GetPlayerY-ceny)^2)^0.5;
				distance*=0.5;
				if(distance<1){
					cenx=GetPlayerX;
					ceny=GetPlayerY;
				}else{
					cenx+=distance*cos(ang);
					ceny+=distance*sin(ang);
				}
			}
			yield;
		}
	}
	
	
	task SlowMove{
		let slowx=[64,32,16,8,4,2,1,0];
		let fastx=[64,63,62,60,56,48,32,0];
		let n=0;
		
		loop{
			if(!OnMissed || OnBorderOfLife){
				if(GetKeyState(VK_SLOWMOVE)){
					if(n<8){
						posx[0]=-slowx[n];
						posx[1]=-slowx[n]/2;
						posx[2]=slowx[n]/2;
						posx[3]=slowx[n];
						n++;
					}
				}else{
					if(n>0){
						n--;
						posx[0]=-fastx[n];
						posx[1]=-fastx[n]/2;
						posx[2]=fastx[n]/2;
						posx[3]=fastx[n];
					}
				}
			}
			yield;
		}
	}
	
	
	task ShotControl{
		let c=0;
		loop{
			if((GetKeyState(VK_SHOT)==KEY_PUSH)||(GetKeyState(VK_SHOT)==KEY_HOLD)){
				c=3;
			}
			
			if(c>0){
				fire=true;
				c--;
				yield;
				fire=false;
				loop(4){yield;}
			}
			yield;
		}
	}
	
	
	task VanishControl{
		loop{
			if(OnMissed && !OnBorderOfLife){
				if(scalex>0){
					scalex-=dscale;
					scaley+=dscale;
				}
				if(alpha>0){
					alpha-=dalpha;
				}
			}else{
				scalex=1;
				scaley=1;
				alpha=255;
			}
			yield;
		}
	}
	
	
	task Rotate{
		loop{
			gang+=6;
			gang%=360;
			yield;
		}
	}
	
	
	task Option(num){
		let obje=Obj_Create(OBJ_EFFECT);
		let obj=Obj_Create(OBJ_EFFECT);
		
		let timer=10800;
		
		ObjEffect_SetTexture(obj,IMG_OPTION);
		ObjEffect_SetLayer(obj,2);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetVertexUV(obj,0,32,0);
		ObjEffect_SetVertexUV(obj,1,32,16);
		ObjEffect_SetVertexUV(obj,2,48,0);
		ObjEffect_SetVertexUV(obj,3,48,16);
		ObjEffect_SetVertexXY(obj,0,-7,-7);
		ObjEffect_SetVertexXY(obj,1,-7,8);
		ObjEffect_SetVertexXY(obj,2,8,-7);
		ObjEffect_SetVertexXY(obj,3,8,8);
		
		ObjEffect_SetTexture(obje,IMG_OPTION);
		ObjEffect_SetLayer(obje,2);
		ObjEffect_SetRenderState(obje,ALPHA);
		ObjEffect_SetPrimitiveType(obje,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obje,4);
		ObjEffect_SetVertexUV(obje,0,32,16);
		ObjEffect_SetVertexUV(obje,1,32,32);
		ObjEffect_SetVertexUV(obje,2,48,16);
		ObjEffect_SetVertexUV(obje,3,48,32);
		ObjEffect_SetVertexXY(obje,0,-10.5,-10.5);
		ObjEffect_SetVertexXY(obje,1,-10.5,11.5);
		ObjEffect_SetVertexXY(obje,2,11.5,-10.5);
		ObjEffect_SetVertexXY(obje,3,11.5,11.5);
		
		while(!Obj_BeDeleted(obj)){
			if(OnMissed && !OnBorderOfLife){
				ObjEffect_SetRenderState(obj,ADD);
			}else{
				ObjEffect_SetRenderState(obj,ALPHA);
			}
			ObjEffect_SetScale(obj,scalex,scaley);
			ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
			
			Obj_SetPosition(obj,cenx+posx[num],ceny);
			Obj_SetPosition(obje,cenx+posx[num],ceny);
			
			if(!OnMissed && !OnEvent){
				if(fire){
					if((GetKeyState(VK_SLOWMOVE)==KEY_PULL)||(GetKeyState(VK_SLOWMOVE)==KEY_FREE)){
						SubShot(Obj_GetX(obj),Obj_GetY(obj));
					}
				}
			}
			
			ObjEffect_SetAngle(obj,0,0,gang);
			ObjEffect_SetAngle(obje,0,0,-gang-90);
			
			timer--;
			
			if(timer==0){
				Option(num);
				Obj_Delete(obj);
				Obj_Delete(obje);
				return;
			}
			yield;
		}
	}
	
	
	task SubShot(x,y){
		let obj=Obj_Create(OBJ_SHOT);
		let alpha=128;
		let dalpha=4;
		let flg=false;
		Obj_SetPosition(obj,x,y);
		Obj_SetSpeed(obj,12);
		Obj_SetAngle(obj,270);
		ObjShot_SetGraphic(obj,2);
		ObjShot_SetDamage(obj,DMG_SUBSHOT);
		ObjShot_SetPenetration(obj,1);
		
		let obje=Obj_Create(OBJ_EFFECT);
		ObjEffect_SetTexture(obje,IMG_SHOT);
		ObjEffect_SetPrimitiveType(obje,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_SetLayer(obje,2);
		ObjEffect_CreateVertex(obje,4);
		ObjEffect_SetVertexUV(obje,0,16,32);
		ObjEffect_SetVertexUV(obje,1,16,48);
		ObjEffect_SetVertexUV(obje,2,32,32);
		ObjEffect_SetVertexUV(obje,3,32,48);
		ObjEffect_SetVertexXY(obje,0,-8,-8);
		ObjEffect_SetVertexXY(obje,1,-8,8);
		ObjEffect_SetVertexXY(obje,2,8,-8);
		ObjEffect_SetVertexXY(obje,3,8,8);
		while(!Obj_BeDeleted(obj)){
			x=Obj_GetX(obj);
			y=Obj_GetY(obj);
			Obj_SetPosition(obje,x,y);
			flg=Obj_IsIntersected(obj);
			yield;
		}
		
		if(!flg){
			Obj_Delete(obje);
			return;
		}
		
		ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
		ObjEffect_SetRenderState(obje,ADD);
		ascent(i in 0..28){
			Obj_SetPosition(obje,x,y);
			y-=1.5;
			if(i==20){alpha=64;}
			if(i>=20){
				ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
				alpha-=dalpha;
				ObjEffect_SetVertexUV(obje,0,16,48);
				ObjEffect_SetVertexUV(obje,1,16,64);
				ObjEffect_SetVertexUV(obje,2,32,48);
				ObjEffect_SetVertexUV(obje,3,32,64);
			}
			yield;
		}
		Obj_Delete(obje);
	}
}